package cn.org.xuanguang.kepler.hormos.orm.dao;

import cn.org.xuanguang.kepler.hormos.orm.result.PagerResult;
import cn.org.xuanguang.kepler.hormos.rdb.dml.Dml;
import cn.org.xuanguang.kepler.hormos.rdb.dml.operator.delete.DeleteOperatorResulet;
import cn.org.xuanguang.kepler.hormos.rdb.dml.operator.insert.InsertOperatorResulet;
import cn.org.xuanguang.kepler.hormos.rdb.dml.operator.update.UpdateOperatorResulet;
import cn.org.xuanguang.kepler.hormos.rdb.dsl.param.QueryParam;
import cn.org.xuanguang.kepler.hormos.rdb.executor.SyncSqlExecutor;

import java.util.Collection;
import java.util.List;

/**
 * 仓库处理模式 - 对数据库操作提供统一接口
 *
 * @param <T> 实体对象
 * @param <K> 主键
 */
public interface HormsBaseSyncRepository<T, K> {

    /**
     * 加载执行器 - 返回用于执行SQL的同步执行器
     *
     * @return SyncSqlExecutor对象
     */
    SyncSqlExecutor getSyncSqlExecutor();

    /**
     * 获取数据源类型 - 用于标识数据源，如MySQL、Oracle等
     *
     * @return 数据源类型的字符串表示
     */
    String getDialect();

    /**
     * 获取DML操作对象 - 用于构造CRUD操作
     *
     * @return Dml对象
     */
    Dml getDml();


    /**
     * 插入数据 - 将实体对象插入数据库
     *
     * @param data 要插入的实体对象
     * @return InsertOperatorResulet 插入操作结果
     */
    InsertOperatorResulet insert(T data);

    /**
     * 批量新增
     * @param data
     * @return
     */
    InsertOperatorResulet insertBatch(Collection<T> data);

    /**
     * 根据Id 更新数据 - 更新指定ID的实体对象
     *
     * @param data 要更新的实体对象
     * @return UpdateOperatorResulet 更新操作结果
     */
    UpdateOperatorResulet updateById(T data);

    //    删除区域

    /**
     * 根据实体对象删除数据 - 从数据库中删除与给定实体匹配的数据
     *
     * @param data 要删除的实体对象
     * @return DeleteOperatorResulet 删除操作结果
     */
    DeleteOperatorResulet delete(T data);

    // 查询
    // 查询第一条记录
    /**
     * 查询第一条记录 - 从数据库中查询第一条记录
     *
     * @return 第一条记录的实体对象，如果未找到返回null
     */
    T queryFirst(QueryParam queryParam);
    /**
     * 根据主键查找数据 - 从数据库中查找与指定主键匹配的实体对象
     *
     * @param primaryKey 主键
     * @return 查找到的实体对象，如果未找到返回null
     */
    T queryById(K primaryKey);

    /**
     * 根据一组主键查找数据 - 从数据库中查找与指定主键集合匹配的实体对象列表
     *
     * @param primaryKey 主键集合
     * @return 查找到的实体对象列表，如果未找到返回空列表
     */
    List<T> queryById(K... primaryKey);

    /**
     * 根据一组主键查找数据 - 从数据库中查找与指定主键集合匹配的实体对象列表
     *
     * @param primaryKey 主键集合
     * @return 查找到的实体对象列表，如果未找到返回空列表
     */
    List<T> queryById(Collection<K> primaryKey);

    /**
     * 查询所有数据 - 从数据库中查询所有实体对象
     *
     * @return 所有实体对象的列表
     */
    List<T> queryAll();

    /**
     * 根据条件查询数据 - 从数据库中查询满足指定条件的实体对象列表
     *
     * @param queryParam 查询参数
     * @return 满足条件的实体对象列表
     */
    PagerResult query(QueryParam queryParam);

    /**
     * 根据条件计算总数 - 计算满足指定条件的记录总数
     *
     * @param queryParam 查询参数
     * @return 满足条件的记录总数
     */
    int count(QueryParam queryParam);

    DeleteOperatorResulet deleteById(K id);

    // 注意: 实现这些方法时需要确保输入验证（如防止SQL注入）和异常处理得到妥善处理。
    // 对于Dml操作和QueryParam的使用，应确保它们能够安全、高效地构造和执行数据库操作。
}
